package com.zx.system.block.mapstruct;

import com.zx.core.context.TenantContextHolder;
import com.zx.core.enums.StatusEnum;
import com.zx.system.block.model.SysDept;
import com.zx.system.block.param.DeptParam;
import com.zx.system.block.vo.SysDeptVO;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;

/**
 * <p>
 * description: 部门参数映射 <br>
 * create: 2024-10-11 22:06
 * </p>
 *
 * @author zhou  xun
 */
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)//忽略未映射的属性
public interface DeptMapStructMapper {
    DeptMapStructMapper INSTANCE = Mappers.getMapper(DeptMapStructMapper.class);

    /**
     * 将DeptParam转换为SysDept实体
     *
     * @param deptParam 部门参数
     * @return SysDept实体
     */
    SysDept deptParamToSysDept(DeptParam deptParam);

    /**
     * 将SysDept实体转换为SysDeptVO视图对象
     *
     * @param sysDept 部门实体
     * @return SysDeptVO视图对象
     */
    SysDeptVO sysDeptToSysDeptVO(SysDept sysDept);

    /**
     * 在映射完成后，设置描述性字段
     *
     * @param sysDept   部门实体
     * @param sysDeptVO 部门VO
     */
    @AfterMapping
    default void setDescriptions(SysDept sysDept, @MappingTarget SysDeptVO sysDeptVO) {
        // 设置状态描述
        Integer status = sysDept.getStatus();
        StatusEnum statusEnum = StatusEnum.getEnumByCode(status);
        if (statusEnum != null) {
            sysDeptVO.setStatusDesc(statusEnum.getDesc());
        }
    }

    /**
     * 在映射完成后，设置租户名
     *
     * @param sysDept   部门实体
     * @param sysDeptVO 部门VO
     */
    @AfterMapping
    default void setTenantName(SysDept sysDept, @MappingTarget SysDeptVO sysDeptVO) {
        sysDeptVO.setTenantName(TenantContextHolder.getTenantName());
    }
}